﻿using DFGK_WMS.Common;
using DFGK_WMS.Common.HttpModule;
using Microsoft.Extensions.Logging;
using Org.BouncyCastle.Ocsp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DFGK_WMS.Model.Wcs;

public class WcsHttpClient
{
    private readonly ICtmHttpClient httpClient;
    private readonly ILogger<WcsHttpClient> logger;

    public WcsHttpClient(ICtmHttpClient httpClient,ILogger<WcsHttpClient> logger)
    {
        this.httpClient = httpClient;
        this.logger = logger;
    }

    /// <summary>
    /// 速锐wcs任务接受接口
    /// </summary>
    /// <param name="taskAccept"></param>
    /// <returns></returns>
    public NewWcsApiRes TaskAcceptApi(TaskAccept taskAccept)
    {
        string url = Config.WcsBaseUrl + "fromWms/taskReceive";//修改为正确的接口地址
        NewWcsApiRes wcsApiRes = null;
        try
        {
            wcsApiRes = httpClient.Post<NewWcsApiRes>(url, taskAccept);
            if (wcsApiRes.returnStatus == 0)
            {
                logger.LogInformation("Wcs任务下发成功");
            }
            else
            {
                logger.LogError("Wcs任务下发失败,msg:" + wcsApiRes.returnInfo);
            }
            return wcsApiRes;
        }
        catch (Exception ex)
        {
            logger.LogError("Wcs任务下发异常,msg:" + ex.Message);
            return new NewWcsApiRes()
            {
                returnStatus = 1,
                returnInfo = ex.Message,
                msgTime = DateTime.Now.ToString()
            };
        }
        finally
        {
            logger.LogInformation($"Wcs任务下发【url:{url}】【入参：{taskAccept.ToJson()}】【出参：{wcsApiRes.ToJson()}】");
        }
    }

    /// <summary>
    /// 速锐wcs任务取消接口
    /// </summary>
    /// <param name="cancelTaskData"></param>
    /// <returns></returns>
    public NewWcsApiRes CancelTaskApi(CancelTaskData cancelTaskData)
    {
        string url = Config.WcsBaseUrl + "fromWms/taskCancel";//修改为正确的接口地址
        NewWcsApiRes wcsApiRes = null;
        try
        {
            wcsApiRes = httpClient.Post<NewWcsApiRes>(url, cancelTaskData);
            if (wcsApiRes.returnStatus == 0)
            {
                logger.LogInformation("Wcs任务取消成功");
            }
            else
            {
                logger.LogError("Wcs任务取消失败,msg:" + wcsApiRes.returnInfo);
            }
            return wcsApiRes;
        }
        catch (Exception ex)
        {
            logger.LogError("Wcs任务取消异常,msg:" + ex.Message);
            return new NewWcsApiRes()
            {
                returnStatus = 1,
                returnInfo = ex.Message,
                msgTime = DateTime.Now.ToString()
            };
        }
        finally
        {
            logger.LogInformation($"Wcs任务取消【url:{url}】【入参：{cancelTaskData.ToJson()}】【出参：{wcsApiRes.ToJson()}】");
        }
    }

    /// <summary>
    /// 速锐wcs任务优先级调整 
    /// </summary>
    /// <param name="priorityTaskData"></param>
    /// <returns></returns>
    public NewWcsApiRes PriorityTaskApi(PriorityTaskData priorityTaskData)
    {
        string url = Config.WcsBaseUrl + "fromWms/taskCancel";//修改为正确的接口地址
        NewWcsApiRes wcsApiRes = null;
        try
        {
            wcsApiRes = httpClient.Post<NewWcsApiRes>(url, priorityTaskData);
            if (wcsApiRes.returnStatus == 0)
            {
                logger.LogInformation("Wcs任务优先级调整成功");
            }
            else
            {
                logger.LogError("Wcs任务优先级调整失败,msg:" + wcsApiRes.returnInfo);
            }
            return wcsApiRes;
        }
        catch (Exception ex)
        {
            logger.LogError("Wcs任务优先级调整异常,msg:" + ex.Message);
            return new NewWcsApiRes()
            {
                returnStatus = 1,
                returnInfo = ex.Message,
                msgTime = DateTime.Now.ToString()
            };
        }
        finally
        {
            logger.LogInformation($"任务优先级调整【url:{url}】【入参：{priorityTaskData.ToJson()}】【出参：{wcsApiRes.ToJson()}】");
        }
    }
    /// <summary>
    /// 速锐wcs货位信息查询
    /// </summary>
    /// <param name="materialInfo"></param>
    /// <returns></returns>
    public NewWcsApiRes GetMaterialInfo(MaterialInfo materialInfo)
    {
        string url = Config.WcsBaseUrl + "fromWms/cargoLocationStatus";//修改为正确的接口地址
        NewWcsApiRes wcsApiRes = null;
        try
        {
            wcsApiRes = httpClient.Post<NewWcsApiRes>(url, materialInfo);
            if (wcsApiRes.returnStatus == 0)
            {
                logger.LogInformation("Wcs货位信息查询成功");
            }
            else
            {
                logger.LogError("Wcs货位信息查询失败,msg:" + wcsApiRes.returnInfo);
            }
            return wcsApiRes;
        }
        catch (Exception ex)
        {
            logger.LogError("Wcs货位信息查询异常,msg:" + ex.Message);
            return new NewWcsApiRes()
            {
                returnStatus = 1,
                returnInfo = ex.Message,
                msgTime = DateTime.Now.ToString(),
                data = null
            };
        }
        finally
        {
            logger.LogInformation($"货位信息查询【url:{url}】【入参：{materialInfo.ToJson()}】【出参：{wcsApiRes.ToJson()}】");
        }
    }

    /// <summary>
    /// 速锐wcs任务目的位置更改
    /// </summary>
    /// <param name="taskChange"></param>
    /// <returns></returns>
    public NewWcsApiRes WMSUpdateTask(TaskChange taskChange)
    {
        string url = Config.WcsBaseUrl + "fromWms/taskChange"; //修改任务位置url地址
        NewWcsApiRes wcsApiRes = null;
        try
        {
            wcsApiRes = httpClient.Post<NewWcsApiRes>(url,taskChange);
            if (wcsApiRes.returnStatus == 0)
            {
                logger.LogInformation("Wcs货位信息查询成功");
            }
            else
            {
                logger.LogError("Wcs货位信息查询失败,msg:" + wcsApiRes.returnInfo);
            }
            return wcsApiRes;
        }
        catch (Exception ex)
        {
            logger.LogError("Wcs货位信息查询异常,msg:" + ex.Message);
            return new NewWcsApiRes()
            {
                returnStatus = 1,
                returnInfo = ex.Message,
                msgTime = DateTime.Now.ToString(),
                data = null
            };
        }
    }


    //--------------------------


    /// <summary>
    /// 出库任务
    /// </summary>
    /// <param name="req"></param>
    /// <returns></returns>
    public WcsApiRes OutTaskApi(WcsTaskApiReq req)
    {
        string url = Config.WcsBaseUrl + "ExternalApi/OutTask";//修改为正确的接口地址
        WcsApiRes wcsApiRes = null;
        try
        {
            wcsApiRes = httpClient.Post<WcsApiRes>(url, req);
            if (wcsApiRes.Code == 0)
            {
                logger.LogInformation("Wcs（出库）任务下发成功");
            }
            else
            {
                logger.LogError("Wcs（出库）任务下发失败,msg:" + wcsApiRes.Msg);
            }
            return wcsApiRes;
        }
        catch (Exception ex)
        {
            logger.LogError("Wcs（出库）任务下发异常,msg:" + ex.Message);
            return new WcsApiRes()
            {
                Code = 1,
                Msg = ex.Message
            };
        }
        finally
        {
            logger.LogInformation($"Wcs出库任务【url:{url}】【入参：{req.ToJson()}】【出参：{wcsApiRes.ToJson()}】");
        }
    }

    /// <summary>
    /// 移库任务
    /// </summary>
    /// <param name="req"></param>
    /// <returns></returns>
    public WcsApiRes TranTaskApi(WcsTaskApiReq req)
    {
        string url = Config.WcsBaseUrl + "ExternalApi/MoveTask";//修改为正确的接口地址
        WcsApiRes wcsApiRes = null;
        try
        {
            wcsApiRes = httpClient.Post<WcsApiRes>(url, req);
            if (wcsApiRes.Code == 0)
            {
                logger.LogInformation("Wcs（移库）任务下发成功");
            }
            else
            {
                logger.LogError("Wcs（移库）任务下发失败,msg:" + wcsApiRes.Msg);
            }
            return wcsApiRes;
        }
        catch (Exception ex)
        {
            logger.LogError("Wcs（移库）任务下发异常,msg:" + ex.Message);
            return new WcsApiRes()
            {
                Code = 1,
                Msg = ex.Message
            };
        }
        finally
        {
            logger.LogInformation($"Wcs移库任务【url:{url}】【入参：{req.ToJson()}】【出参：{wcsApiRes.ToJson()}】");
        }
    }

    /// <summary>
    /// 切换入库模式
    /// </summary>
    /// <param name="req"></param>
    /// <returns></returns>
    public WcsApiRes ModeSwitchInApi()
    {
        string url = Config.WcsBaseUrl + "ExternalApi/ModeSwitchIn";//修改为正确的接口地址
        WcsApiRes wcsApiRes = null;
        try
        {
            wcsApiRes = httpClient.Post<WcsApiRes>(url);
            if (wcsApiRes.Code == 0)
            {
                logger.LogInformation("Wcs切换入库模式成功");
            }
            else
            {
                logger.LogError("Wcs切换入库模式失败,msg:" + wcsApiRes.Msg);
            }
            return wcsApiRes;
        }
        catch (Exception ex)
        {
            logger.LogError("Wcs切换入库模式异常,msg:" + ex.Message);
            return new WcsApiRes()
            {
                Code = 1,
                Msg = ex.Message
            };
        }
        finally
        {
            logger.LogInformation($"Wcs切换模式【url:{url}】【入参：无】【出参：{wcsApiRes.ToJson()}】");
        }
    }
}
